#!/bin/bash
source /etc/profile

# 设置默认的 JDK 路径，允许通过环境变量覆盖
#JAVA_HOME=${JAVA_HOME:-/opt/jdk1.7.0_80}
#export JAVA_HOME
#export PATH=$JAVA_HOME/bin:$PATH
#export LC_ALL=zh_CN.UTF-8

acs_pid=$(ps -ef|grep -v grep |grep  acs_server.jar|awk '{print $2}')

usage() {
    echo "Usage: $0 -s [stop|start|restart|status] -p port"
}

# 如果没有参数，则显示用法
if [ $# -eq 0 ]; then
    usage
    exit 1
fi

# 获取传入的参数
while getopts ":s:p:" opt; do
    case $opt in
        s)
            s=$OPTARG
            if [[ "$s" != "start" && "$s" != "stop" && "$s" != "restart" && "$s" != "status" ]]; then
                echo "-s 参数错误: $s"
                usage
                exit 1
            fi
            ;;
        p)
            port=$OPTARG
            if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -gt 65535 ]; then
                echo "-p 参数错误: $port"
                usage
                exit 1
            fi
            ;;
        \?)
            echo "无效的参数: -$OPTARG"
            usage
            exit 1
            ;;
    esac
done

# 获取指定端口的所有 PID（改进的查找方式）
get_pids_by_port() {
    local port=$1
    # 使用多种方式查找进程ID，确保找到所有相关进程
    local pids=""
    
    # 方法1: 使用 ss 命令
    pids=$(ss -ltnp 2>/dev/null | grep ":$port " | awk '{print $6}' | grep -o 'pid=[0-9]*' | cut -d'=' -f2 | sort -u)
    
    # 方法2: 使用 netstat 作为备选
    if [ -z "$pids" ]; then
        pids=$(netstat -ltnp 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f1 | grep -E '^[0-9]+$' | sort -u)
    fi
    
    # 方法3: 使用 lsof 作为最后的备选
    if [ -z "$pids" ] && command -v lsof >/dev/null 2>&1; then
        pids=$(lsof -ti:$port 2>/dev/null | sort -u)
    fi
    
    echo "$pids"
}

# 强制终止进程的函数
kill_processes() {
    local pids=$1
    local port=$2
    
    if [ -z "$pids" ]; then
        echo "未找到运行在端口 $port 的进程"
        return 0
    fi
    
    echo "找到运行在端口 $port 的进程: $pids"
    
    for pid in $pids; do
        if [ -n "$pid" ] && kill -0 $pid 2>/dev/null; then
            echo "正在终止进程 $pid..."
            
            # 先尝试优雅终止
            kill $pid 2>/dev/null
            sleep 2
            
            # 检查进程是否还在运行
            if kill -0 $pid 2>/dev/null; then
                echo "进程 $pid 未响应 SIGTERM，使用 SIGKILL 强制终止..."
                kill -9 $pid 2>/dev/null
                sleep 1
                
                # 最终检查
                if kill -0 $pid 2>/dev/null; then
                    echo "警告: 进程 $pid 仍在运行"
                else
                    echo "进程 $pid 已被强制终止"
                fi
            else
                echo "进程 $pid 已优雅终止"
            fi
        fi
    done
    
    # 等待端口释放
    echo "等待端口 $port 释放..."
    for i in {1..10}; do
        if ! ss -ltn 2>/dev/null | grep -q ":$port "; then
            echo "端口 $port 已释放"
            return 0
        fi
        sleep 1
    done
    
    echo "警告: 端口 $port 可能仍被占用"
    return 1
}

# 查找 bin 目录
binPath=$(find /opt/acs/ -type d -name 'bin' | grep $port | head -1)

if [ -z "$binPath" ]; then
    echo "未找到对应端口 $port 的 bin 目录，请检查 ACS 安装路径。"
    exit 1
fi

case $s in
    restart)
        echo "重启 ACS $port"
        pids=$(get_pids_by_port $port)
        
        if [ -n "$pids" ]; then
            kill_processes "$pids" $port
        else
            echo "ACS 进程未运行在端口 $port"
        fi
        
        echo "启动 ACS $port"
        cd "$binPath" || { echo "无法切换到 $binPath"; exit 1; }
        nohup ./startup.sh >/dev/null 2>&1 &
        
        # 等待服务启动
        sleep 3
        new_pids=$(get_pids_by_port $port)
        if [ -n "$new_pids" ]; then
            echo "ACS 已成功启动，PID: $new_pids"
        else
            echo "警告: ACS 可能启动失败，请检查日志"
        fi
        ;;
    start)
        pids=$(get_pids_by_port $port)
        if [ -n "$pids" ]; then
            echo "ACS 已在端口 $port 运行，PID: $pids"
            exit 0
        fi
        
        echo "启动 ACS $port"
        cd "$binPath" || { echo "无法切换到 $binPath"; exit 1; }
        nohup ./startup.sh >/dev/null 2>&1 &
        
        # 等待服务启动
        sleep 3
        new_pids=$(get_pids_by_port $port)
        if [ -n "$new_pids" ]; then
            echo "ACS 已成功启动，PID: $new_pids"
        else
            echo "警告: ACS 可能启动失败，请检查日志"
        fi
        ;;
    stop)
        pids=$(get_pids_by_port $port)
        if [ -z "$pids" ]; then
            echo "未找到运行在端口 $port 的 ACS 进程"
            exit 0
        fi
        
        echo "停止 ACS $port"
        kill_processes "$pids" $port
        ;;
    status)
        pids=$(get_pids_by_port $port)
        if [ -z "$pids" ]; then
            echo "ACS 未在端口 $port 运行"
        else
            echo "ACS 正在端口 $port 运行，PID: $pids"
        fi
        ;;
esac